通过nginx与wsgi的本地应用理解反向代理与中间工具

JiGeng

创建时间:2024年9月27日 05:04

编辑时间:2024年9月27日 05:31

nginx与wsgi的本地应用,通过gunicorn或uwsgi启动更直观地了解是什么

nginx 安装 brew apt-get yum 都可以,忽略,或者源码包编译。

nginx在mac下默认端口是8080,只要启动nginx,127.0.0.1:8080或者localhost:8080 就会有nginx启动页面。

brew services start nginx # 以系统启动
nginx  #或者直接nginx通过bin也可以启动

我们也可以到conf去修改。

以项目runserver为例,默认是8000,我们改为8080,

python manage.py runserver 0.0.0.0:8080

同样道理,如果我们用gunicorn启动

gunicorn t2t.wsgi:application -b :8080

会发现端口被占用

Error: That port is already in use.

结论:理解了吗?

对!应用项目、反向代理、wsgi中间沟通层不可直接启动,他们会占用同一个端口。


那么奇怪了,如何让他们一起启动到同一个URI端口?

这就必须要通过nginx、gunicorn的配置文件使得他们相互认识,并且协同处理同一个uri。


三者沟通原理就是这么简单。


好,那么为什么会出现wsgi(读作威士忌)

如同HTTP协议,wsgi也是一个协议,本身并不是可用的工具,而uwsgi和gunicorn才是工具——中间层。


关于协议,必定有不遵循协议的,wsgi特指Python社区严格定义的协议,部分框架是遵守的,如Django、flask、tornado等等这类统称为Paster应用项目(原因是早期有个这种项目最早最完整遵循了wsgi原则),所以在uwsgi和gunicorn文档会特别指明需要时paster应用才好使用此中间工具。当然也有部分不遵守,比如特殊的需求,或者自行手搓wsgi也是可以的。


# 用户获取信息:用户》浏览器》反向代理Nginx》wsgi协议沟通工具(gunicorn、uwsgi)》应用服务Django》数据库。反之亦然
同理,用户读写信息也是如此。 #


而反向代理和应用服务一般是无法沟通的,所以在HTTP协议约束下、应用编写代码约束下、反向代理约束下形成了一个伟大的沟通协议(超级翻译机)———— wsgi  。

所以后端工程师就可以集中精力在构建应用、编写代码而不是处理如何与反向代理沟通。